package com.alameda.service.impl.type;

import com.alameda.common.base.constant.SqlDmlConstant;
import com.alameda.common.exception.BusinessException;
import com.alameda.common.utils.ExcelUtils;
import com.alameda.common.utils.ObjectUtils;
import com.alameda.common.utils.PubUtils;
import com.alameda.filestorage.business.service.FileStorageComponent;
import com.alameda.mapper.type.AdMediaTypeMapper;
import com.alameda.pojo.type.AdMediaTypeDO;
import com.alameda.service.media.AdMediaService;
import com.alameda.service.type.AdMediaTypeService;
import com.alameda.type.bo.AdMediaTypeBO;
import com.alameda.type.dto.AdMediaTypeDTO;
import com.alameda.type.vo.AdMediaTypeVO;
import com.alameda.video.vo.ApVideoVO;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

import static com.alameda.common.base.constant.MediaConstant.SaveOrUpdateConstant.ONE;
import static com.alameda.common.base.constant.MediaConstant.SaveOrUpdateConstant.ZERO;

/**
 * 媒体文件分类 业务逻辑层 具体实现
 *
 * @author Lv
 * @date 2024/07/20
 */
@Slf4j
@Service
public class AdMediaTypeServiceImpl extends ServiceImpl<AdMediaTypeMapper, AdMediaTypeDO> implements AdMediaTypeService {

    @Autowired
    private AdMediaTypeMapper adMediaTypeMapper;

    /**
     * 查询媒体文件分类
     *
     * @param adMediaTypeDTO 媒体文件分类信息
     * @return
     */
    @Override
    public IPage<AdMediaTypeVO> loadMediaType(AdMediaTypeDTO adMediaTypeDTO) {
        IPage<AdMediaTypeDO> page = new Page<>(adMediaTypeDTO.getPageNum(), adMediaTypeDTO.getPageSize());
        LambdaQueryWrapper<AdMediaTypeDO> lambdaQueryWrapper = getLambdaQueryWrapper(adMediaTypeDTO);

        IPage<AdMediaTypeDO> pageData = this.page(page, lambdaQueryWrapper);
        return ObjectUtils.convertPageData(pageData, AdMediaTypeVO.class);
    }

    /**
     * 获取条件构造对象
     *
     * @param adMediaTypeDTO 媒体文件分类信息
     * @return
     */
    private LambdaQueryWrapper<AdMediaTypeDO> getLambdaQueryWrapper(AdMediaTypeDTO adMediaTypeDTO) {
        return Wrappers.lambdaQuery(AdMediaTypeDO.class)
                .like(PubUtils.isNotEmpty(adMediaTypeDTO.getTypeName()), AdMediaTypeDO::getTypeName, adMediaTypeDTO.getTypeName())
                .orderByDesc(AdMediaTypeDO::getCreateTime);
    }

    /**
     * 导出excel
     *
     * @param adMediaTypeDTO 媒体文件分类信息
     */
    @Override
    public void export(AdMediaTypeDTO adMediaTypeDTO) {
        List<AdMediaTypeBO> adMediaTypeBOList = getExportData(adMediaTypeDTO);
        ExcelUtils.export(adMediaTypeBOList, AdMediaTypeBO.class, "视频分类");
    }

    @Autowired
    private FileStorageComponent fileStorageComponent;

    /**
     * 保存或修改分类
     *
     * @param adMediaTypeDTO 媒体文件分类信息
     * @return
     */
    @Override
    public Boolean saveOrUpdateType(AdMediaTypeDTO adMediaTypeDTO) {
        checkData(adMediaTypeDTO);

        // 上传封面文件
        String typeCoverFileUrl = PubUtils.isNotNull(adMediaTypeDTO.getTypeCoverFile())
                ? fileStorageComponent.uploadFile(adMediaTypeDTO.getTypeCoverFile())
                : adMediaTypeDTO.getTypeCoverUrl();

        AdMediaTypeDO adMediaTypeDO = ObjectUtils.convert(adMediaTypeDTO, AdMediaTypeDO.class);
        adMediaTypeDO.setTypeCoverUrl(typeCoverFileUrl);

        return this.saveOrUpdate(adMediaTypeDO);
    }

    /**
     * 校验数据
     *
     * @param adMediaTypeDTO 媒体文件分类信息
     */
    private void checkData(AdMediaTypeDTO adMediaTypeDTO) {
        // 通过判断新增 修改 获取判断值
        Long checkCount = PubUtils.isNotNull(adMediaTypeDTO.getId()) ? ONE : ZERO;
        Long count = this.count(AdMediaTypeDO.builder().typeName(adMediaTypeDTO.getTypeName()).build());
        if (count > checkCount) {
            BusinessException.throwException("已存在同名分类");
        }
    }

    /**
     * 查询分类列表
     *
     * @param adMediaTypeDTO 媒体文件分类信息
     * @return
     */
    @Override
    public List<AdMediaTypeVO> listTypeInfo(AdMediaTypeDTO adMediaTypeDTO) {
        LambdaQueryWrapper<AdMediaTypeDO> lambdaQueryWrapper = getLambdaQueryWrapper(adMediaTypeDTO);
        // 控制移动端数据加载量
        lambdaQueryWrapper.last(SqlDmlConstant.LIMIT + adMediaTypeDTO.getLoadCount());

        List<AdMediaTypeDO> adMediaTypeDOList = this.list(lambdaQueryWrapper);
        return ObjectUtils.convertList(adMediaTypeDOList, AdMediaTypeVO.class);
    }

    @Autowired
    private AdMediaService adMediaService;

    /**
     * 通过类型查询视频列表
     *
     * @param adMediaTypeDTO 媒体文件分类信息
     * @return
     */
    @Override
    public List<ApVideoVO> loadMediaByType(AdMediaTypeDTO adMediaTypeDTO) {
        return adMediaService.loadMediaByType(adMediaTypeDTO);
    }

    /**
     * 通过分类id读取视频id集合
     *
     * @param mediaTypeId 分类id
     * @return
     */
    @Override
    public List<Long> findByMediaTypeId(Long mediaTypeId) {
        return adMediaTypeMapper.findByMediaTypeId(mediaTypeId);
    }

    /**
     * 通过媒体id读取分类信息
     *
     * @param mediaId 媒体id
     * @return
     */
    @Override
    public AdMediaTypeVO findTypeInfoByMediaId(Long mediaId) {
        AdMediaTypeDO adMediaTypeDO = adMediaTypeMapper.findTypeInfoByMediaId(mediaId);
        return ObjectUtils.convert(adMediaTypeDO, AdMediaTypeVO.class);
    }

    /**
     * 获取导出数据
     *
     * @param adMediaTypeDTO 媒体文件分类信息
     * @return
     */
    private List<AdMediaTypeBO> getExportData(AdMediaTypeDTO adMediaTypeDTO) {
        if (PubUtils.isNotEmpty(adMediaTypeDTO.getIdList())) {
            List<AdMediaTypeDO> adMediaTypeDOList = this.findByIdInOrderByCreateTimeDesc(adMediaTypeDTO.getIdList());
            return ObjectUtils.convertList(adMediaTypeDOList, AdMediaTypeBO.class);
        } else {
            IPage<AdMediaTypeVO> pageData = this.loadMediaType(adMediaTypeDTO);
            return ObjectUtils.convertList(pageData.getRecords(), AdMediaTypeBO.class);
        }
    }
}
